import gradio as gr
import os
import json
import uvicorn
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import Optional
from openai import OpenAI

# --- 配置部分 ---
BAIDU_API_KEY = os.environ.get("BAIDU_API_KEY", "xxx")  # 请替换为您的百度AI Key
BAIDU_BASE_URL = "https://aistudio.baidu.com/llm/lmapi/v3"
MODEL_NAME = "ernie-4.5-turbo-vl"  # 使用支持图文的模型

# 初始化客户端
client = OpenAI(
    api_key=BAIDU_API_KEY,
    base_url=BAIDU_BASE_URL,
)


# 支持的国际组织列表
INTERNATIONAL_ORGANIZATIONS = [
    "联合国 (UN)",
    "世界卫生组织 (WHO)",
    "国际红十字会与红新月会联合会 (IFRC)",
    "世界银行 (World Bank)",
    "国际货币基金组织 (IMF)",
    "世界贸易组织 (WTO)",
    "国际奥委会 (IOC)",
    "国际劳工组织 (ILO)",
    "联合国教科文组织 (UNESCO)",
    "北约 (NATO)",
    "欧盟 (EU)",
    "东盟 (ASEAN)",
    "非洲联盟 (AU)",
    "亚太经合组织 (APEC)",
    "上海合作组织 (SCO)",
    "其他（请手动输入）",
]

# 支持的语言列表
SUPPORTED_LANGUAGES = [
    "中文",
    "英语",
    "法语",
    "西班牙语",
    "俄语",
    "阿拉伯语",
    "葡萄牙语",
    "德语",
    "日语",
    "韩语",
    "其他",
]

# 查询类型配置（统一键名与显示名，解决KeyError问题）
QUERY_TYPES = {
    "organization_profile": "组织概况",
    "policy_analysis": "政策分析",
    "membership": "成员信息",
    "funding": "资金管理",
    "projects": "项目动态",
    "cooperation": "合作指南",
    "news_analysis": "最新动态",
    "custom": "定制分析",
}

# 查询类型描述
query_type_descriptions = {
    "organization_profile": "组织基本概况：成立背景、核心宗旨、组织结构及主要职能",
    "policy_analysis": "政策决议分析：主要政策内容、实施情况及产生的影响",
    "membership": "成员信息：构成情况、加入条件、享有的权利与应尽义务",
    "funding": "资金管理：来源渠道、预算分配方式及财务管理机制",
    "projects": "项目动态：当前开展的主要项目、实施成效及参与途径",
    "cooperation": "合作指南：合作方式、申请流程及注意事项",
    "news_analysis": "最新动态：近期重要事件、发展趋势及潜在影响分析",
    "custom": "定制分析：针对特定问题提供深度解读和专业建议",
}


# --- 核心处理函数 ---
def generate_org_analysis_core(
    organization: str,
    query_type: str,
    specific_question: str,
    language: str = "中文",
    context: str = "",
    custom_org: str = "",
):
    """生成国际组织分析的核心函数"""
    # 处理"其他"组织的情况
    if organization == "其他（请手动输入）":
        if not custom_org.strip():
            return {"success": False, "error": "请输入具体的国际组织名称"}
        organization = custom_org

    # 验证查询类型
    if query_type not in query_type_descriptions:
        return {"success": False, "error": f"无效的查询类型: {query_type}"}

    # 验证必填参数
    if not organization.strip():
        return {"success": False, "error": "请选择或输入国际组织名称"}
    if not specific_question.strip():
        return {"success": False, "error": "请输入具体问题"}

    # 构建系统提示
    system_prompt = f"""
    你是一位精通国际组织运作的专家，拥有丰富的国际关系知识和多边合作经验。
    你的任务是为用户提供关于国际组织的专业分析和建议。
    
    请用{language}回答，确保专业术语准确，并根据不同语言的表达习惯进行适当调整。
    你的回答应基于事实，同时提供有深度的见解和实用建议。
    对于复杂问题，应结构化呈现，逻辑清晰，便于用户理解和应用。
    """

    # 构建用户提示
    user_prompt = f"""
    请分析以下关于{organization}的问题：
    
    查询类型：{query_type_descriptions[query_type]}
    {f'问题背景：{context}' if context else ''}
    具体问题：{specific_question}
    
    请提供全面、专业的分析，包括事实性信息和有价值的见解。
    若涉及流程或步骤，请清晰列出；若涉及建议，请提供切实可行的方案。
    """

    try:
        # 调用百度AI API
        completion = client.chat.completions.create(
            model=MODEL_NAME,
            messages=[
                {"role": "system", "content": system_prompt},
                {"role": "user", "content": user_prompt},
            ],
            stream=False,
            temperature=0.4,  # 保持专业性和准确性
            top_p=0.9,
        )

        ai_response = completion.choices[0].message.content
        return {"success": True, "result": ai_response}
    except Exception as e:
        error_msg = f"API调用错误: {str(e)}"
        print(error_msg)
        return {"success": False, "error": f"分析失败：{str(e)}"}


def generate_cooperation_proposal_core(
    organization: str,
    entity_type: str,
    entity_name: str,
    objectives: str,
    resources: str,
    language: str = "中文",
    custom_org: str = "",
):
    """生成合作提案的核心函数"""
    # 处理"其他"组织的情况
    if organization == "其他（请手动输入）":
        if not custom_org.strip():
            return {"success": False, "error": "请输入具体的国际组织名称"}
        organization = custom_org

    # 验证必填参数
    if not organization.strip():
        return {"success": False, "error": "请选择或输入国际组织名称"}
    if not entity_name.strip():
        return {"success": False, "error": "请输入实体名称"}
    if not objectives.strip():
        return {"success": False, "error": "请描述合作目标"}
    if not resources.strip():
        return {"success": False, "error": "请说明可提供的资源"}

    # 构建系统提示
    system_prompt = f"""
    你是一位国际合作专家，擅长起草与国际组织的合作提案。
    请用{language}起草一份专业、简洁且有说服力的合作提案框架。
    提案应符合国际组织的规范和期望，突出合作价值和可行性。
    """

    # 构建用户提示
    user_prompt = f"""
    请为以下实体起草一份与{organization}的合作提案框架：
    
    实体类型：{entity_type}
    实体名称：{entity_name}
    合作目标：{objectives}
    可提供资源：{resources}
    
    提案应包含以下部分：
    1. 引言：介绍实体背景和合作意愿
    2. 合作价值：说明合作对双方的益处
    3. 合作领域：建议具体的合作领域和方向
    4. 实施计划：初步的合作步骤和时间表
    5. 资源投入：各方可能投入的资源
    6. 预期成果：合作可能带来的具体成果
    
    请确保提案专业、务实且具有吸引力，语言简洁明了。
    """

    try:
        completion = client.chat.completions.create(
            model=MODEL_NAME,
            messages=[
                {"role": "system", "content": system_prompt},
                {"role": "user", "content": user_prompt},
            ],
            stream=False,
            temperature=0.6,  # 适当提高创造性
        )

        ai_response = completion.choices[0].message.content
        return {"success": True, "result": ai_response}
    except Exception as e:
        error_msg = f"API调用错误: {str(e)}"
        print(error_msg)
        return {"success": False, "error": f"提案生成失败：{str(e)}"}


def translate_official_doc_core(
    content: str, source_language: str, target_language: str, domain: str = "general"
):
    """翻译官方文件的核心函数"""
    # 验证输入
    if not content.strip():
        return {"success": False, "error": "请输入需要翻译的内容"}
    if source_language == target_language:
        return {"success": False, "error": "源语言和目标语言不能相同"}

    # 领域特定提示
    domain_specific_prompt = ""
    if domain == "legal":
        domain_specific_prompt = (
            "内容涉及法律文件，请特别注意法律术语的准确翻译，保持法律文书的严谨性。"
        )
    elif domain == "technical":
        domain_specific_prompt = (
            "内容涉及技术文件，请确保技术术语的准确翻译和专业表达。"
        )
    elif domain == "diplomatic":
        domain_specific_prompt = (
            "内容涉及外交文件，请保持翻译的正式性、准确性和外交辞令的恰当使用。"
        )

    # 构建系统提示
    system_prompt = f"""
    你是一位专业的多语言翻译专家，擅长国际组织官方文件的翻译。
    请将以下{source_language}内容准确翻译成{target_language}。
    翻译应忠实于原文，同时符合目标语言的表达习惯和专业规范。
    保持原文的语气、正式程度和专业准确性。
    {domain_specific_prompt}
    """

    # 构建用户提示
    user_prompt = f"请翻译以下内容：\n\n{content}"

    try:
        completion = client.chat.completions.create(
            model=MODEL_NAME,
            messages=[
                {"role": "system", "content": system_prompt},
                {"role": "user", "content": user_prompt},
            ],
            stream=False,
            temperature=0.3,  # 翻译需保持准确性
        )

        ai_response = completion.choices[0].message.content
        return {"success": True, "result": ai_response}
    except Exception as e:
        error_msg = f"API调用错误: {str(e)}"
        print(error_msg)
        return {"success": False, "error": f"翻译失败：{str(e)}"}


# --- Gradio界面包装函数 ---
def generate_org_analysis_for_gradio(
    organization, query_type, specific_question, language, context, custom_org
):
    result_dict = generate_org_analysis_core(
        organization, query_type, specific_question, language, context, custom_org
    )
    if result_dict["success"]:
        return f"## 📊 {organization} 分析结果\n\n{result_dict['result']}"
    else:
        return f"## ⚠️ 错误提示\n\n{result_dict['error']}\n\n请检查输入内容后重试。"


def generate_cooperation_proposal_for_gradio(
    organization, entity_type, entity_name, objectives, resources, language, custom_org
):
    result_dict = generate_cooperation_proposal_core(
        organization,
        entity_type,
        entity_name,
        objectives,
        resources,
        language,
        custom_org,
    )
    if result_dict["success"]:
        return f"## 🤝 与{organization}合作提案框架\n\n{result_dict['result']}"
    else:
        return f"## ⚠️ 错误提示\n\n{result_dict['error']}\n\n请检查输入内容后重试。"


def translate_official_doc_for_gradio(
    content, source_language, target_language, domain
):
    result_dict = translate_official_doc_core(
        content, source_language, target_language, domain
    )
    if result_dict["success"]:
        return f"### 🔍 翻译结果（{source_language} → {target_language}）\n\n{result_dict['result']}"
    else:
        return f"## ⚠️ 错误提示\n\n{result_dict['error']}\n\n请检查输入内容后重试。"


# --- Gradio界面定义 ---
def gradio_interface():
    with gr.Blocks(
        title="GlobalOrg Navigator - 国际组织智能助手",
        theme=gr.themes.Soft(),
    ) as demo:
        gr.Markdown(
            """
        # 🌐  GlobalOrg Navigator
        ## 国际组织智能助手（基于文心一言4.5）
        
        专业的国际组织分析与合作支持平台，助力您在全球治理与国际合作中把握机遇。
        """
        )

        with gr.Tabs():
            with gr.Tab("📊 国际组织分析"):
                gr.Markdown("获取关于国际组织的专业分析、政策解读和最新动态")

                with gr.Row():
                    with gr.Column(scale=1):
                        org_organization = gr.Dropdown(
                            label="国际组织",
                            choices=INTERNATIONAL_ORGANIZATIONS,
                            value="联合国 (UN)",
                        )
                        # 自定义组织输入框，默认隐藏
                        custom_org_input = gr.Textbox(
                            label="自定义组织名称",
                            placeholder="请输入国际组织名称",
                            visible=False,
                        )

                        # 查询类型下拉框，使用键值对确保匹配
                        org_query_type = gr.Dropdown(
                            label="查询类型",
                            choices=[(v, k) for k, v in QUERY_TYPES.items()],
                            value="organization_profile",
                        )
                        org_language = gr.Dropdown(
                            label="输出语言", choices=SUPPORTED_LANGUAGES, value="中文"
                        )

                # 控制自定义组织输入框的显示/隐藏
                def toggle_custom_org(organization):
                    return gr.update(visible=(organization == "其他（请手动输入）"))

                org_organization.change(
                    fn=toggle_custom_org,
                    inputs=[org_organization],
                    outputs=[custom_org_input],
                )

                with gr.Row():
                    with gr.Column(scale=1):
                        org_context = gr.Textbox(
                            label="问题背景 (可选)",
                            placeholder="请描述相关背景信息，帮助获得更精准的回答",
                        )
                        org_specific_question = gr.Textbox(
                            label="具体问题 *",
                            placeholder="请输入您想了解的具体问题",
                            lines=3,
                        )
                        org_btn = gr.Button("生成分析", variant="primary")

                with gr.Row():
                    org_output = gr.Markdown(label="分析结果")

                org_btn.click(
                    fn=generate_org_analysis_for_gradio,
                    inputs=[
                        org_organization,
                        org_query_type,
                        org_specific_question,
                        org_language,
                        org_context,
                        custom_org_input,
                    ],
                    outputs=org_output,
                )

            with gr.Tab("🤝 合作提案生成"):
                gr.Markdown("生成与国际组织合作的专业提案框架")

                with gr.Row():
                    with gr.Column(scale=1):
                        coop_organization = gr.Dropdown(
                            label="目标国际组织",
                            choices=INTERNATIONAL_ORGANIZATIONS,
                            value="联合国 (UN)",
                        )
                        # 自定义组织输入框
                        coop_custom_org = gr.Textbox(
                            label="自定义组织名称",
                            placeholder="请输入国际组织名称",
                            visible=False,
                        )
                        coop_entity_type = gr.Dropdown(
                            label="实体类型",
                            choices=[
                                "政府机构",
                                "非政府组织",
                                "企业",
                                "学术机构",
                                "其他",
                            ],
                            value="非政府组织",
                        )
                        coop_entity_name = gr.Textbox(
                            label="实体名称 *", placeholder="请输入您的组织/机构名称"
                        )
                        coop_language = gr.Dropdown(
                            label="提案语言", choices=SUPPORTED_LANGUAGES, value="中文"
                        )

                # 控制自定义组织输入框显示
                coop_organization.change(
                    fn=toggle_custom_org,
                    inputs=[coop_organization],
                    outputs=[coop_custom_org],
                )

                with gr.Row():
                    with gr.Column(scale=1):
                        coop_objectives = gr.Textbox(
                            label="合作目标 *",
                            placeholder="请描述您希望通过合作实现的目标",
                            lines=3,
                        )
                        coop_resources = gr.Textbox(
                            label="可提供资源 *",
                            placeholder="请描述您可以提供的资源（资金、人力、技术等）",
                            lines=3,
                        )
                        coop_btn = gr.Button("生成提案框架", variant="primary")

                with gr.Row():
                    coop_output = gr.Markdown(label="合作提案框架")

                coop_btn.click(
                    fn=generate_cooperation_proposal_for_gradio,
                    inputs=[
                        coop_organization,
                        coop_entity_type,
                        coop_entity_name,
                        coop_objectives,
                        coop_resources,
                        coop_language,
                        coop_custom_org,
                    ],
                    outputs=coop_output,
                )

            with gr.Tab("🌍 官方文件翻译"):
                gr.Markdown("专业翻译国际组织官方文件，保持术语准确和文体规范")

                with gr.Row():
                    with gr.Column(scale=1):
                        trans_source_lang = gr.Dropdown(
                            label="源语言", choices=SUPPORTED_LANGUAGES, value="英语"
                        )
                        trans_target_lang = gr.Dropdown(
                            label="目标语言", choices=SUPPORTED_LANGUAGES, value="中文"
                        )
                        trans_domain = gr.Dropdown(
                            label="文件领域",
                            choices=[
                                ("general", "通用文件"),
                                ("legal", "法律文件"),
                                ("technical", "技术文件"),
                                ("diplomatic", "外交文件"),
                            ],
                            value="general",
                        )

                with gr.Row():
                    with gr.Column(scale=1):
                        trans_content = gr.Textbox(
                            label="需要翻译的内容 *",
                            placeholder="请输入或粘贴需要翻译的文本",
                            lines=6,
                        )
                        trans_btn = gr.Button("翻译", variant="primary")

                with gr.Row():
                    trans_output = gr.Markdown(
                        label="翻译结果"
                    )  # 改为Markdown以支持格式

                trans_btn.click(
                    fn=translate_official_doc_for_gradio,
                    inputs=[
                        trans_content,
                        trans_source_lang,
                        trans_target_lang,
                        trans_domain,
                    ],
                    outputs=trans_output,
                )

        gr.Markdown(
            """
        ---
        ### 使用说明
        - 带*的为必填项，需完整填写以获得更精准的结果
        - 本工具提供的分析和建议仅供参考，重要决策请咨询相关领域专家
        - 翻译结果可能存在细微差异，正式使用前请由专业翻译人员审核
        - 数据和分析基于公开信息和AI模型训练数据，如有变动请以官方发布为准
        """
        )

    return demo


# --- FastAPI 应用和 API 端点定义 ---
app = FastAPI(
    title=" GlobalOrg Navigator API",
    description="国际组织智能助手API接口",
)


# 请求模型定义
class OrgAnalysisRequest(BaseModel):
    organization: str
    query_type: str
    specific_question: str
    language: Optional[str] = "中文"
    context: Optional[str] = ""
    custom_org: Optional[str] = ""


class CooperationProposalRequest(BaseModel):
    organization: str
    entity_type: str
    entity_name: str
    objectives: str
    resources: str
    language: Optional[str] = "中文"
    custom_org: Optional[str] = ""


class TranslationRequest(BaseModel):
    content: str
    source_language: str
    target_language: str
    domain: Optional[str] = "general"


# API端点
@app.post("/api/analyze-organization", summary="分析国际组织")
async def api_analyze_organization(request: OrgAnalysisRequest):
    result = generate_org_analysis_core(
        request.organization,
        request.query_type,
        request.specific_question,
        request.language,
        request.context,
        request.custom_org,
    )
    if result["success"]:
        return result
    else:
        raise HTTPException(status_code=500, detail=result["error"])


@app.post("/api/generate-proposal", summary="生成合作提案")
async def api_generate_proposal(request: CooperationProposalRequest):
    result = generate_cooperation_proposal_core(
        request.organization,
        request.entity_type,
        request.entity_name,
        request.objectives,
        request.resources,
        request.language,
        request.custom_org,
    )
    if result["success"]:
        return result
    else:
        raise HTTPException(status_code=500, detail=result["error"])


@app.post("/api/translate-document", summary="翻译官方文件")
async def api_translate_document(request: TranslationRequest):
    result = translate_official_doc_core(
        request.content,
        request.source_language,
        request.target_language,
        request.domain,
    )
    if result["success"]:
        return result
    else:
        raise HTTPException(status_code=500, detail=result["error"])


@app.get("/health", summary="健康检查")
async def health_check():
    return {"status": "healthy"}


# 挂载Gradio界面
demo = gradio_interface()
app = gr.mount_gradio_app(app=app, blocks=demo, path="/")

if __name__ == "__main__":
    print("🚀 启动 GlobalOrg Navigator 服务...")
    print("📱 Gradio 界面访问地址: http://localhost:7860")
    print("💻 FastAPI 文档地址: http://localhost:7860/docs")
    print("-" * 50)
    uvicorn.run(app, host="0.0.0.0", port=7860)
